﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Hardcodet.Wpf.TaskbarNotification;

namespace AGMLite.Windows.Notify
{
  /// <summary>
  /// Interaction logic for FancyBalloon.xaml
  /// </summary>
  public partial class FancyBalloon : System.Windows.Controls.UserControl
  {
      public event RoutedEventHandler DoubleClickEvent;
      private bool isClosing = false;    

    #region BalloonText dependency property

    /// <summary>
    /// Description
    /// </summary>
    public static readonly DependencyProperty BalloonTextProperty =
        DependencyProperty.Register("BalloonText",
                                    typeof (string),
                                    typeof (FancyBalloon),
                                    new FrameworkPropertyMetadata(""));

    /// <summary>
    /// Title
    /// </summary>
    public static readonly DependencyProperty BalloonTitleProperty =
        DependencyProperty.Register("BalloonTitle",
                                    typeof(string),
                                    typeof(FancyBalloon),
                                    new FrameworkPropertyMetadata(""));

    /// <summary>
    /// Title
    /// </summary>
    public static readonly DependencyProperty BalloonSubTitleProperty =
        DependencyProperty.Register("BalloonSubTitle",
                                    typeof(string),
                                    typeof(FancyBalloon),
                                    new FrameworkPropertyMetadata(""));

    /// <summary>
    /// Icon
    /// </summary>
    public static readonly DependencyProperty BalloonIconProperty =
        DependencyProperty.Register("BalloonIcon",
                                    typeof(string),
                                    typeof(FancyBalloon),
                                    new FrameworkPropertyMetadata(""));

    /// <summary>
    /// A property wrapper for the <see cref="BalloonTextProperty"/>
    /// dependency property:<br/>
    /// Description
    /// </summary>
    public string BalloonText
    {
      get { return (string) GetValue(BalloonTextProperty); }
      set { SetValue(BalloonTextProperty, value); }
    }

    /// <summary>
    /// A property wrapper for the <see cref="BalloonTitleProperty"/>
    /// dependency property:<br/>
    /// Description
    /// </summary>
    public string BalloonTitle
    {
        get { return (string)GetValue(BalloonTitleProperty); }
        set { SetValue(BalloonTitleProperty, value); }
    }

    /// <summary>
    /// A property wrapper for the <see cref="BalloonSubTitleProperty"/>
    /// dependency property:<br/>
    /// Description
    /// </summary>
    public string BalloonSubTitle
    {
        get { return (string)GetValue(BalloonSubTitleProperty); }
        set { SetValue(BalloonSubTitleProperty, value); }
    }

    /// <summary>
    /// A property wrapper for the <see cref="BalloonIconProperty"/>
    /// dependency property:<br/>
    /// Description
    /// </summary>
    public string BalloonIcon
    {
        get { return (string)GetValue(BalloonIconProperty); }
        set { SetValue(BalloonIconProperty, value); }
    }

    #endregion


    public FancyBalloon()
    {
      InitializeComponent();
      TaskbarIcon.AddBalloonClosingHandler(this, OnBalloonClosing);
    }


    /// <summary>
    /// By subscribing to the <see cref="TaskbarIcon.BalloonClosingEvent"/>
    /// and setting the "Handled" property to true, we suppress the popup
    /// from being closed in order to display the fade-out animation.
    /// </summary>
    private void OnBalloonClosing(object sender, RoutedEventArgs e)
    {
      e.Handled = true;
      isClosing = true;
    }


    /// <summary>
    /// Resolves the <see cref="TaskbarIcon"/> that displayed
    /// the balloon and requests a close action.
    /// </summary>
    private void imgClose_MouseDown(object sender, MouseButtonEventArgs e)
    {
      //the tray icon assigned this attached property to simplify access
      TaskbarIcon taskbarIcon = TaskbarIcon.GetParentTaskbarIcon(this);
      taskbarIcon.CloseBalloon();
    }

    /// <summary>
    /// If the users hovers over the balloon, we don't close it.
    /// </summary>
    private void grid_MouseEnter(object sender, MouseEventArgs e)
    {
      //if we're already running the fade-out animation, do not interrupt anymore
      //(makes things too complicated for the sample)
      if (isClosing) return;

      //the tray icon assigned this attached property to simplify access
      TaskbarIcon taskbarIcon = TaskbarIcon.GetParentTaskbarIcon(this);
      taskbarIcon.ResetBalloonCloseTimer();
    }


    /// <summary>
    /// Closes the popup once the fade-out animation completed.
    /// The animation was triggered in XAML through the attached
    /// BalloonClosing event.
    /// </summary>
    private void OnFadeOutCompleted(object sender, EventArgs e)
    {
      Popup pp = (Popup)Parent;
      pp.IsOpen = false;
    }

    private void txtText_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            if (e.ClickCount == 2)
            {
                if (DoubleClickEvent != null)
                {
                    DoubleClickEvent(this, new RoutedEventArgs());
                }
                TaskbarIcon taskbarIcon = TaskbarIcon.GetParentTaskbarIcon(this);
                taskbarIcon.CloseBalloon();
            }
        }
    }
  }
}
